#include "user_h.h"
#include "cms8s6990.h"
#include "xxdduq.h"

#define RX1_Length 250
#define TX1_Length 250

typedef struct
{
    u8 TX_read;  // 发送读指针
    u8 TX_write; // 发送写指针
    u8 RX_read;  // 接收读指针
    u8 RX_write; // 接收写指针
    u8 TX_Busy;  // 忙标志
} COMx_Define;

COMx_Define xdata COM1;

u8 xdata RX1_Buffer[RX1_Length]; // 接收缓冲
u8 xdata TX1_Buffer[TX1_Length]; // 发送缓冲


//串口1


/*************** 装载串口1发送缓冲 *******************************/


void TX1_write2buff(char dat) //写入发送缓冲，指针+1
{
#if 1//优化串口fifo,
	u8 tx_write;
	if (COM1.TX_Busy == 0) //空闲
	{
		COM1.TX_Busy = 1; //标志忙
        SBUF1 = dat;
    }
    else
    {
        tx_write = 	COM1.TX_write;
        if (++tx_write == TX1_Length)
        {
            tx_write = 0;
        }
        if (tx_write == COM1.TX_read)
        {
            return;
        }
        TX1_Buffer[COM1.TX_write] = dat; //装发送缓冲
        COM1.TX_write = tx_write;
    }
#else
	if (COM1.TX_Busy == 0) //空闲
	{
		COM1.TX_Busy = 1; //标志忙
        SBUF1 = dat;
    }
    else
    {
        while ((COM1.TX_write + 1) % TX1_Length == COM1.TX_read)
		; //如果缓存满就等待发送一个字节
        TX1_Buffer[COM1.TX_write] = dat; //装发送缓冲
        COM1.TX_write = (++COM1.TX_write) % TX1_Length;
    }
#endif
}



/**************************************************
*函数名称：void hex_to_uart1( uchar  * s,uchar i)
*函数功能：发送数据流到串口1
*入口参数：*s，数组指针，i，数据个数
*出口参数：void
*备注	 ：
**************************************************/
void hex_to_uart1( uchar  * s,uchar i)
{
	while(i)
    {
        i--;
        TX1_write2buff(*s);
        s++;
    }
}

/**************************************************
*函数名称：char uart1_read_data(uchar *s, uchar j)
*函数功能：获取读缓存中的数据
*入口参数：uchar *s 缓存指针，j取数据个数
*出口参数：uchar i,取出数据个数
*备注	 ：
**************************************************/
//uchar uart1_read_data(uchar *s, uchar j)
//{
//    uchar i = 0,x;
//    while (COM1.RX_read != COM1.RX_write)
//    {
//        x = RX1_Buffer[COM1.RX_read];
//		*s = x;
//        COM1.RX_read = (++COM1.RX_read) % RX1_Length;
//        s++;
//        i++;
//        if (i == j)
//        {
//            break;
//        }
//    }
//    return x;
//}

/**************************************************
*函数名称：uchar uart0_read_data_num(void)
*函数功能：返回uart0 接收缓存数据数量
*入口参数：
*出口参数：数量
*备注	 ：
**************************************************/
//uchar uart1_read_data_num(void)
//{
 //   return (COM1.RX_write - COM1.RX_read + RX1_Length) % RX1_Length;
//}

/**************************************************
*函数名称：UART1_IRQHandler(void)  interrupt UART1_VECTOR 
*函数功能：串口1中断函数
*入口参数：void
*出口参数：void
*备注	 ：
**************************************************/
void UART1_IRQHandler(void)  interrupt UART1_VECTOR 
{
#if 1//优化串口fifo,	
	u8 temp;
	if (SCON1 & UART_SCON1_RI1_Msk)//UART_GetReceiveIntFlag(UART1)
    {
        // UART_ClearReceiveIntFlag(UART1);
		temp  = SCON1;
		temp &= ~(UART_SCON1_RI1_Msk);
		SCON1 = temp | UART_SCON1_TI1_Msk;				

        RS485_Parse(SBUF1);
    }
    if (SCON1 & UART_SCON1_TI1_Msk)
    {
        // UART_ClearSendIntFlag(UART1);
        temp = SCON1;
        temp &= ~(UART_SCON1_TI1_Msk);
        SCON1 = temp | UART_SCON1_RI1_Msk;
        if (COM1.TX_read != COM1.TX_write)
        {
            SBUF1 = TX1_Buffer[COM1.TX_read];
//            COM1.TX_read = (++COM1.TX_read) % TX1_Length;
            if (++COM1.TX_read == TX1_Length)
            {
                COM1.TX_read = 0;
            }
        }
        else
            COM1.TX_Busy = 0;
    }
#else	
	if (UART_GetReceiveIntFlag(UART1))
    {
        UART_ClearReceiveIntFlag(UART1);
//        RX1_Buffer[COM1.RX_write] = SBUF1;
//        if (++COM1.RX_write >= RX1_Length)
//            COM1.RX_write = 0;
//        uart1_rx_callback(); 
		RS485_Parse(SBUF1);
    }
    if (UART_GetSendIntFlag(UART1))
    {
        UART_ClearSendIntFlag(UART1);
        if (COM1.TX_read != COM1.TX_write)
        {
            SBUF1 = TX1_Buffer[COM1.TX_read];
            COM1.TX_read = (++COM1.TX_read) % TX1_Length;
        }
        else
            COM1.TX_Busy = 0;
    }
#endif	
}



/******************************************************************************
 ** \brief	 putchar
 ** \param [in] data
 **            	
 ** \return  none
 ** \note   <stdio.h>中需要的函数
 ******************************************************************************/
char putchar(char num)
{
	TX1_write2buff(num);
	return num;
}

/********************************************************************************
 ** \brief	 puts 
 **
 ** \param [in]  bytes addr for sending
 **
 ** \return  <stdio.h>中需要的函数,发送字符串函数
 ******************************************************************************/
int  puts( const char  * s)
{
	while(*s)
	{
		putchar(*s);	
		s++;
	}
	return 0;
}